package com.sinog.biz.service.api.impl;

import com.alibaba.fastjson.JSON;
import com.sinog.biz.mapper.havexml.PrisonerFxMapper;
import com.sinog.biz.mapper.havexml.PrisonerMainExcelTempMapper;
import com.sinog.biz.mapper.havexml.PrisonerMainMapper;
import com.sinog.biz.mapper.havexml.SystemCodeMapper;
import com.sinog.biz.service.api.DataTransmissionForExcelService;
import com.sinog.biz.service.business.PrisonerFxExcelTempBatchService;
import com.sinog.biz.service.business.PrisonerMainExcelTempBatchService;
import com.sinog.biz.service.business.PrisonerSrExcelTempBatchService;
import com.sinog.biz.service.business.PrisonerZnExcelTempBatchService;
import com.sinog.biz.util.BusinessUtils;
import com.sinog.biz.util.IdGen;
import com.sinog.biz.util.smlib.Sm4;
import com.sinog.core.domain.PrisonerFxExcelTemp;
import com.sinog.core.domain.PrisonerMainExcelTemp;
import com.sinog.core.domain.PrisonerSrExcelTemp;
import com.sinog.core.domain.PrisonerZnExcelTemp;
import com.sinog.core.domain.SystemCode;
import com.sinog.core.domain.UserInterFaceEntity;
import com.sinog.core.util.DateUtil;
import com.sinog.core.util.IdNumUtil;
import com.sinog.core.util.JsonUtil;
import com.sinog.core.util.PhoneUtil;
import com.sinog.core.util.StrUtil;
import com.sinog.core.utilbean.Constants;
import com.sinog.core.utilbean.Dictionary;
import com.sinog.core.utilbean.Result;
import com.sinog.core.utilbean.ReturnCode;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * @desc excel批量导入实现类
 * @author lzq
 * @date -
 */
@Slf4j
@Service
public class DataTransmissionForExcelServiceImpl implements DataTransmissionForExcelService {

    @Resource
    private PrisonerMainExcelTempBatchService prisonerMainExcelTempBatchService;
    @Resource
    private PrisonerFxExcelTempBatchService prisonerFxExcelTempBatchService;
    @Resource
    private PrisonerSrExcelTempBatchService prisonerSrExcelTempBatchService;
    @Resource
    private PrisonerZnExcelTempBatchService prisonerZnExcelTempBatchService;
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private SystemCodeMapper systemCodeMapper;
    @Resource
    private PrisonerMainExcelTempMapper prisonerMainExcelTempMapper;
    @Resource
    private PrisonerMainMapper prisonerMainMapper;
    @Resource
    private PrisonerFxMapper prisonerFxMapper;
    /**
     * 初始化字典表
     */
    private static final Dictionary DICTIONARY = Dictionary.getSingleton();

    /**
     * excel批量导入保存到临时表
     * @param data data
     * @return Result
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result savePreArrangedPersonnelExcelTemp(String data) {
        // 1、定义返回结果
        Result r;
        // 2、打印biz入参日志
        log.info("对外接口入参:{}",data);
        // 3、定义接口整体执行开始时间和封装开始时间
        long start = System.currentTimeMillis();
        // 4、定义接口用户对象
        UserInterFaceEntity user = new UserInterFaceEntity();
        // 5、定义5张表数据对象，用于接收客户端传递的参数
        PrisonerMainExcelTemp prisonerMainExcelTemp = new PrisonerMainExcelTemp();
        PrisonerFxExcelTemp prisonerFxExcelTemp = new PrisonerFxExcelTemp();
        List<PrisonerSrExcelTemp> prisonerSrExcelTemps = new ArrayList<>(16);
        List<PrisonerZnExcelTemp> prisonerZnExcelTemps = new ArrayList<>(16);
        // 6、处理流程
        try {
            // 6.1、check
            Map<String,Object> check = check(data);
            boolean err = (Boolean)check.get("err");
            if(err) {
                if(check.containsKey("PrisonerMainExcelTemp") && null != check.get("PrisonerMainExcelTemp")) {
                    prisonerMainExcelTemp = (PrisonerMainExcelTemp)check.get("PrisonerMainExcelTemp");
                    prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ZERO);
                    prisonerMainExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                    boolean pNameFlag = StringUtils.isBlank(prisonerMainExcelTemp.getPName());
                    boolean sexFlag = StringUtils.isBlank(prisonerMainExcelTemp.getSex());
                    boolean nationalityFlag = StringUtils.isBlank(prisonerMainExcelTemp.getNationality());
                    boolean idTypeFlag = StringUtils.isBlank(prisonerMainExcelTemp.getIdType());
                    boolean idNumFlag = ((ArrayList)check.get("result")).contains("100088");
                    boolean addtimeFlag = null == prisonerMainExcelTemp.getAddtime();
                    boolean educationFlag = StringUtils.isBlank(prisonerMainExcelTemp.getEducation());
                    boolean priAddrFlag = StringUtils.isBlank(prisonerMainExcelTemp.getPriAddr());
                    boolean nativeproFlag = StringUtils.isBlank(prisonerMainExcelTemp.getNativepro());
                    boolean nativecityFlag = StringUtils.isBlank(prisonerMainExcelTemp.getNativecity());
                    boolean nativecouFlag = StringUtils.isBlank(prisonerMainExcelTemp.getNativecou());
                    boolean nativenumFlag = StringUtils.isBlank(prisonerMainExcelTemp.getNativenum());
                    if(pNameFlag || sexFlag || nationalityFlag || idTypeFlag || addtimeFlag || educationFlag || priAddrFlag || nativeproFlag || nativecityFlag || nativecouFlag || nativenumFlag || idNumFlag) {
                        prisonerMainExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ONE);
                        prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ONE);
                    }
                }
                if(check.containsKey("PrisonerFxExcelTemp") && null != check.get("PrisonerFxExcelTemp")) {
                    prisonerFxExcelTemp = (PrisonerFxExcelTemp)check.get("PrisonerFxExcelTemp");
                    prisonerFxExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                    boolean critypeFlag = StringUtils.isBlank(prisonerFxExcelTemp.getCritype());
                    boolean pritimeFlag = StringUtils.isBlank(prisonerFxExcelTemp.getPritime());
                    boolean arrJgFlag = StringUtils.isBlank(prisonerFxExcelTemp.getArrJg());
                    boolean precriFlag = StringUtils.isBlank(prisonerFxExcelTemp.getPrecri());
                    boolean canjiFlag = StringUtils.isBlank(prisonerFxExcelTemp.getCanji());
                    boolean priBeginFlag = null == prisonerFxExcelTemp.getPriBegin();
                    boolean priStopFlag = false;
                    if(Constants.PritimeTypeNow.PRITIME_YOUQI.equals(prisonerFxExcelTemp.getPritime())) {
                        priStopFlag = null == prisonerFxExcelTemp.getPriStop();
                    }
                    boolean addpenaltyFlag = StringUtils.isBlank(prisonerFxExcelTemp.getAddpenalty());
                    boolean aftypeFlag = StringUtils.isBlank(prisonerFxExcelTemp.getAftype());
                    boolean bqzyFlag = StringUtils.isBlank(prisonerFxExcelTemp.getBqzy());
                    if(critypeFlag || pritimeFlag || arrJgFlag || precriFlag || canjiFlag || priBeginFlag || priStopFlag || addpenaltyFlag || aftypeFlag || bqzyFlag) {
                        prisonerFxExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ONE);
                        prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ONE);
                    }
                }
                if(check.containsKey("PrisonerSrExcelTemp") && null != check.get("PrisonerSrExcelTemp")) {
                    prisonerSrExcelTemps = (List<PrisonerSrExcelTemp>)check.get("PrisonerSrExcelTemp");
                    for(PrisonerSrExcelTemp prisonerSrExcelTemp : prisonerSrExcelTemps) {
                        prisonerSrExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                        if(StringUtils.isBlank(prisonerSrExcelTemp.getThename())) {
                            prisonerSrExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ONE);
                            prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ONE);
                        }
                    }
                }
                if(check.containsKey("PrisonerZnExcelTemp") && null != check.get("PrisonerZnExcelTemp")) {
                    prisonerZnExcelTemps = (List<PrisonerZnExcelTemp>)check.get("PrisonerZnExcelTemp");
                    for(PrisonerZnExcelTemp prisonerZnExcelTemp : prisonerZnExcelTemps) {
                        prisonerZnExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                        if(StringUtils.isBlank(prisonerZnExcelTemp.getName())) {
                            prisonerZnExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ONE);
                            prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ONE);
                        }
                    }
                }
                if(check.containsKey("user") && null != check.get("user")) {
                    user = (UserInterFaceEntity) check.get("user");
                }
            } else {
                if(check.containsKey("PrisonerMainExcelTemp") && null != check.get("PrisonerMainExcelTemp")) {
                    prisonerMainExcelTemp = (PrisonerMainExcelTemp)check.get("PrisonerMainExcelTemp");
                    prisonerMainExcelTemp.setSuccessFlag(Constants.NumberStr.NUM_STR_ZERO);
                    prisonerMainExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                }
                if(check.containsKey("PrisonerFxExcelTemp") && null != check.get("PrisonerFxExcelTemp")) {
                    prisonerFxExcelTemp = (PrisonerFxExcelTemp)check.get("PrisonerFxExcelTemp");
                    prisonerFxExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                }
                if(check.containsKey("PrisonerSrExcelTemp") && null != check.get("PrisonerSrExcelTemp")) {
                    prisonerSrExcelTemps = (List<PrisonerSrExcelTemp>)check.get("PrisonerSrExcelTemp");
                    for(PrisonerSrExcelTemp prisonerSrExcelTemp : prisonerSrExcelTemps) {
                        prisonerSrExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                    }
                }
                if(check.containsKey("PrisonerZnExcelTemp") && null != check.get("PrisonerZnExcelTemp")) {
                    prisonerZnExcelTemps = (List<PrisonerZnExcelTemp>)check.get("PrisonerZnExcelTemp");
                    for(PrisonerZnExcelTemp prisonerZnExcelTemp : prisonerZnExcelTemps) {
                        prisonerZnExcelTemp.setCheckFlag(Constants.NumberStr.NUM_STR_ZERO);
                    }
                }
                if(check.containsKey("user") && null != check.get("user")) {
                    user = (UserInterFaceEntity) check.get("user");
                }
            }
            // 6.2、组装数据
            assembled(user,prisonerMainExcelTemp,prisonerFxExcelTemp,prisonerSrExcelTemps,prisonerZnExcelTemps);
            // 6.3、生成犯罪编号
            String priNum = BusinessUtils.makePriNum(prisonerMainMapper,stringRedisTemplate,user.getDepartid(),user.getLevel());
            if(Constants.StrFinalValue.ERROR.equals(priNum)){
                return Result.failure(ReturnCode.FAILURE);
            }
            // 6.4、调用入库方法
            r = saveT(prisonerMainExcelTemp,prisonerFxExcelTemp,prisonerSrExcelTemps,prisonerZnExcelTemps,priNum,user);
        } catch(ClassCastException c) {
            log.error("发生异常:",c);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return Result.failure(ReturnCode.PARAM_TYPE_FAILURE);
        } catch(Exception e) {
            log.error("发生异常:",e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return Result.failure(ReturnCode.FAILURE);
        }
        log.info("预安置人员信息录入【总耗时】:{} ms",System.currentTimeMillis() - start);
        return r;
    }

    /**
     * 2、校验接口入参
     * @param data 原始json基础上封装user对象
     * @return Map<String,Object>
     */
    private Map<String,Object> check(String data) {
        long start = System.currentTimeMillis();
        // 用于保存返回的错误code集合
        List<String> errCodes = new ArrayList<>(16);
        Map<String,Object> result = new HashMap<>(16);
        Map<String,Object> maps = JsonUtil.toMap(data);
        String uuid = maps.get("uuid").toString();
        UserInterFaceEntity userDTO = JsonUtil.toBean(maps.get("user").toString(),UserInterFaceEntity.class);
        Map<String,Object> prisonerMainMap;
        if(null != maps.get("PrisonerMainExcelTemp") && !"".equals(maps.get("PrisonerMainExcelTemp").toString())) {
            prisonerMainMap = JsonUtil.toMap(maps.get("PrisonerMainExcelTemp").toString());
        } else {
            prisonerMainMap = new HashMap<>(16);
        }
        Map<String,Object> prisonerFxMap;
        if(null != maps.get("PrisonerFxExcelTemp") && !"".equals(maps.get("PrisonerFxExcelTemp").toString())) {
            prisonerFxMap = JsonUtil.toMap(maps.get("PrisonerFxExcelTemp").toString());
        } else {
            prisonerFxMap = new HashMap<>(16);
        }
        List<PrisonerSrExcelTemp> prisonerSrExcelTemps;
        if(null != maps.get("PrisonerSrExcelTemp") && !"".equals(maps.get("PrisonerSrExcelTemp").toString())) {
            prisonerSrExcelTemps = JsonUtil.toList(maps.get("PrisonerSrExcelTemp")
                                                       .toString(),PrisonerSrExcelTemp.class);
            //转换一下
            for(PrisonerSrExcelTemp temp : prisonerSrExcelTemps) {
                temp.setSrIdtype(temp.getIdType());
            }
        } else {
            prisonerSrExcelTemps = new ArrayList<>(16);
        }
        List<PrisonerZnExcelTemp> prisonerZnExcelTemps;
        if(null != maps.get("PrisonerZnExcelTemp") && !"".equals(maps.get("PrisonerZnExcelTemp").toString())) {
            prisonerZnExcelTemps = JsonUtil.toList(maps.get("PrisonerZnExcelTemp")
                                                       .toString(),PrisonerZnExcelTemp.class);
            for(PrisonerZnExcelTemp temp : prisonerZnExcelTemps) {
                temp.setZnIdtype(temp.getIdType());
            }
        } else {
            prisonerZnExcelTemps = new ArrayList<>(16);
        }
        PrisonerMainExcelTemp prisonerMainExcelTemp;
        PrisonerFxExcelTemp prisonerFxExcelTemp = null;
        // 1、check主表
        {
            Iterator<Map.Entry<String,Object>> iterator = prisonerMainMap.entrySet().iterator();
            while(iterator.hasNext()) {
                Map.Entry<String,Object> next = iterator.next();
                Object obj = next.getValue();
                if(obj instanceof String) {
                    next.setValue(((String)obj).trim());
                }
            }
            // 取出prisonerMainMap并校验
            String pName = (String)prisonerMainMap.get("pName");
            String usedName = (String)prisonerMainMap.get("usedName");
            String sex = (String)prisonerMainMap.get("sex");
            String nationality = (String)prisonerMainMap.get("nationality");
            String idType = (String)prisonerMainMap.get("idType");
            String idNum = (String)prisonerMainMap.get("idNum");
            String age;
            if(prisonerMainMap.get("age") instanceof Long) {
                long age1 = (long)prisonerMainMap.get("age");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                age = sdf.format(new Date(age1));
            } else {
                age = (String)prisonerMainMap.get("age");
            }
            String addtime;
            if(prisonerMainMap.get("addtime") instanceof Long) {
                long addtime1 = (long)prisonerMainMap.get("addtime");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                addtime = sdf.format(new Date(addtime1));
            } else {
                addtime = (String)prisonerMainMap.get("addtime");
            }
            String education = (String)prisonerMainMap.get("education");
            String priAddr = (String)prisonerMainMap.get("priAddr");
            String nativepro = (String)prisonerMainMap.get("nativepro");
            String nativecity = (String)prisonerMainMap.get("nativecity");
            String nativecou = (String)prisonerMainMap.get("nativecou");
            String nativevill = (String)prisonerMainMap.get("nativevill");
            String nativenum = (String)prisonerMainMap.get("nativenum");
            String placepro = (String)prisonerMainMap.get("placepro");
            String placecity = (String)prisonerMainMap.get("placecity");
            String placecou = (String)prisonerMainMap.get("placecou");
            String placevill = (String)prisonerMainMap.get("placevill");
            String placenum = (String)prisonerMainMap.get("placenum");
            // 校验
            if(StringUtils.isEmpty(pName)) {
                //预安置人员 姓名不能为空。
                errCodes.add("100001");
            }
            if(!StringUtils.isEmpty(pName) && 30 < pName.length()) {
                //预安置人员 姓名长度不能超过30。
                errCodes.add("100002");
                prisonerMainMap.put("pName","");
            }
            if(!StringUtils.isEmpty(usedName) && 30 < usedName.length()) {
                //预安置人员 曾用名长度不能超过30。
                errCodes.add("100003");
                prisonerMainMap.put("usedName","");
            }
            if(StringUtils.isEmpty(sex)) {
                //预安置人员 性别不能为空。
                errCodes.add("100004");
            }
            if(!StringUtils.isEmpty(sex) && !StrUtil.containsEquals(sex,DICTIONARY.getsex())) {
                //预安置人员 性别不正确。
                errCodes.add("100005");
                prisonerMainMap.put("sex","");
            }
            if(StringUtils.isEmpty(nationality)) {
                //预安置人员 民族不能为空。
                errCodes.add("100006");
            }
            if(!StringUtils.isEmpty(nationality) && !StrUtil.containsEquals(nationality,DICTIONARY.getnationality())) {
                //预安置人员 民族编码不正确。
                errCodes.add("100007");
                prisonerMainMap.put("nationality","");
            }
            if(StringUtils.isEmpty(idType)) {
                //预安置人员 证件类型不能为空。
                errCodes.add("100040");
            }
            if(!StringUtils.isEmpty(idType) && !StrUtil.containsEquals(idType,DICTIONARY.getIdType())) {
                //预安置人员 证件类型编码不正确。
                errCodes.add("100041");
                prisonerMainMap.put("idType","");
            }
            if(!StringUtils.isEmpty(idNum) && Constants.NumberStr.NUM_STR_ONE.equals(idType)) {
                if((18 != idNum.length()) && (15 != idNum.length())) {
                    //预安置人员 身份证号码不正确。
                    errCodes.add("100008");
                    prisonerMainMap.put("idNum","");
                }
                if(!Constants.StrFinalValue.WU.equals(idNum)) {
                    List<Integer> integer = prisonerMainMapper.existIdnum(Sm4.encryptEcb(idNum),Constants.SpecialChar.NUM_BLANK);
                    if(null != integer && !integer.isEmpty()) {
                        //身份证号码重复
                        errCodes.add("100088");
                        prisonerMainMap.put("idNum","");
                    }
                }
            }
            if(!StringUtils.isEmpty(age) && DateUtil.checkStrDate(age)) {
                //预安置人员 出生日期不正确。
                errCodes.add("100009");
                prisonerMainMap.put("age","");
            }
            if(StringUtils.isEmpty(addtime)) {
                //预安置人员 入监日期不能为空。
                errCodes.add("100010");
            }
            if(!StringUtils.isEmpty(addtime) && DateUtil.checkStrDate(addtime)) {
                //预安置人员 入监日期不正确。
                errCodes.add("100011");
                prisonerMainMap.put("addtime","");
            }
            if(!StringUtils.isEmpty(addtime) && !StringUtils.isEmpty(age) && 0 > addtime.compareTo(age)) {
                //预安置人员 入监日期不能大于出生日期。
                errCodes.add("100012");
                prisonerMainMap.put("age","");
                prisonerMainMap.put("addtime","");
            }
            if(StringUtils.isEmpty(education)) {
                //预安置人员 文化程度不能为空。
                errCodes.add("100013");
            }
            if(!StringUtils.isEmpty(education) && !StrUtil.containsEquals(education,DICTIONARY.geteducation())) {
                //预安置人员 文化程度编码不正确。
                errCodes.add("100014");
                prisonerMainMap.put("education","");
            }
            if(StringUtils.isEmpty(priAddr)) {
                //预安置人员 户籍类型编码不能为空。
                errCodes.add("100015");
            }
            //excel导入priaddr只能是01、02 农村和城镇
            if(!StringUtils.isEmpty(priAddr) && !StrUtil.containsEquals(priAddr,"01","02")) {
                //预安置人员 户籍类型编码不正确。
                errCodes.add("100016");
                prisonerMainMap.put("priAddr","");
            }
            if(StringUtils.isEmpty(nativepro)) {
                //预安置人员 户籍地址省份编码不能为空。
                errCodes.add("100017");
            } else {
                if(StringUtils.isEmpty(nativecity)) {
                    //预安置人员 户籍地址地市编码不能为空。
                    errCodes.add("100018");
                } else {
                    if(StringUtils.isEmpty(nativecou)) {
                        //预安置人员 户籍地址区县编码不能为空。
                        errCodes.add("100019");
                    }
                }
            }
            if(!StringUtils.isEmpty(nativepro)) {
                String pCodePro = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",nativepro);
                if(!Constants.NumberStr.NUM_STR_FU_ONE.equals(pCodePro)) {
                    //预安置人员 户籍地址编码不正确。
                    errCodes.add("100020");
                    prisonerMainMap.put("nativepro","");
                } else {
                    if(!StringUtils.isEmpty(nativecity)) {
                        String pCodeCity = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",nativecity);
                        if(!nativepro.equals(pCodeCity)) {
                            //预安置人员 户籍地址编码不正确。
                            errCodes.add("100020");
                            prisonerMainMap.put("nativecity","");
                        } else {
                            if(!StringUtils.isEmpty(nativecou)) {
                                String pCodeCou = (String)stringRedisTemplate.opsForHash()
                                                                             .get("areaCodeAndPcode",nativecou);
                                if(!nativecity.equals(pCodeCou)) {
                                    //预安置人员 户籍地址编码不正确。
                                    errCodes.add("100020");
                                    prisonerMainMap.put("nativecou","");
                                } else {
                                    if(!StringUtils.isEmpty(nativevill)) {
                                        String pCodeVill = (String)stringRedisTemplate.opsForHash()
                                                                                      .get("areaCodeAndPcode",nativevill);
                                        if(!nativecou.equals(pCodeVill)) {
                                            //预安置人员 户籍地址编码不正确。
                                            errCodes.add("100020");
                                            prisonerMainMap.put("nativevill","");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if(StringUtils.isEmpty(nativenum)) {
                //预安置人员 户籍详细地址不能为空。
                errCodes.add("100021");
            }
            if(!StringUtils.isEmpty(nativenum) && 50 < nativenum.length()) {
                //预安置人员 户籍详细地址长度不能超过50。
                errCodes.add("100022");
                prisonerMainMap.put("nativenum","");
            }
            if(!StringUtils.isEmpty(placepro)) {
                String pCodePro = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",placepro);
                if(!Constants.NumberStr.NUM_STR_FU_ONE.equals(pCodePro)) {
                    //预安置人员 居住地址编码不正确。
                    errCodes.add("100023");
                    prisonerMainMap.put("placepro","");
                } else {
                    if(!StringUtils.isEmpty(placecity)) {
                        String pCodeCity = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",placecity);
                        if(!placepro.equals(pCodeCity)) {
                            //预安置人员 居住地址编码不正确。
                            errCodes.add("100023");
                            prisonerMainMap.put("placecity","");
                        } else {
                            if(!StringUtils.isEmpty(placecou)) {
                                String pCodeCou = (String)stringRedisTemplate.opsForHash()
                                                                             .get("areaCodeAndPcode",placecou);
                                if(!placecity.equals(pCodeCou)) {
                                    //预安置人员 居住地址编码不正确。
                                    errCodes.add("100023");
                                    prisonerMainMap.put("placecou","");
                                } else {
                                    if(!StringUtils.isEmpty(placevill)) {
                                        String pCodeVill = (String)stringRedisTemplate.opsForHash()
                                                                                      .get("areaCodeAndPcode",placevill);
                                        if(!placecou.equals(pCodeVill)) {
                                            //预安置人员 居住地址编码不正确。
                                            errCodes.add("100023");
                                            prisonerMainMap.put("placevill","");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            boolean flag = (!StringUtils.isEmpty(placevill) && (StringUtils.isEmpty(placepro) || StringUtils.isEmpty(placecity) || StringUtils.isEmpty(placecou))) || (!StringUtils.isEmpty(placecou) && (StringUtils.isEmpty(placepro) || StringUtils.isEmpty(placecity))) || (!StringUtils.isEmpty(placecity) && StringUtils.isEmpty(placepro));
            if(flag) {
                //预安置人员 居住地址编码上级未填写。
                errCodes.add("100024");
            }
            if(!StringUtils.isEmpty(placenum) && 50 < placenum.length()) {
                //预安置人员 居住地详细地址长度不能超过50。
                errCodes.add("100025");
                prisonerMainMap.put("placenum","");
            }
            // 封装实体类，设置一些默认项
            String json = JSON.toJSONString(prisonerMainMap);
            prisonerMainExcelTemp = JsonUtil.toBean(json,PrisonerMainExcelTemp.class);
            prisonerMainExcelTemp.setUuid(uuid);
            // 如果证件类型为身份证，生日是空，默认设置生日为省份证中出生日期
            if(Constants.NumberStr.NUM_STR_ONE.equals(idType) && !StringUtils.isEmpty(idNum) && 18 == idNum.length() && StringUtils.isEmpty(age)) {
                // 身份证不为空，并且为18位身份证，设置生日为身份证的7～14位
                String year = idNum.substring(6,10);
                String month = idNum.substring(10,12);
                String day = idNum.substring(12,14);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Date birthday = null;
                try {
                    // 注意格式需要与上面一致，不然会出现异常
                    birthday = sdf.parse(new StringBuffer(year).append("-").append(month).append("-").append(day)
                                                               .toString());
                } catch(ParseException e) {
                    log.error("发生异常:",e);
                }
                prisonerMainExcelTemp.setAge(birthday);
            }
            prisonerMainExcelTemp.setPdanwei(userDTO.getDepartid());
            prisonerMainExcelTemp.setPdanweiName(userDTO.getDepartName());
            // 城镇、农村
            prisonerMainExcelTemp.setHjType(Constants.NumberStr.NUM_STR_ZERO_ONE);
        }
        // 2、check服刑信息表
        {
            Iterator<Map.Entry<String,Object>> iterator = prisonerFxMap.entrySet().iterator();
            while(iterator.hasNext()) {
                Map.Entry<String,Object> next = iterator.next();
                Object obj = next.getValue();
                if(obj instanceof String) {
                    next.setValue(((String)obj).trim());
                }
            }
            if(!prisonerFxMap.isEmpty()) {
                // 取出prisonerFxMap并校验
                String critype = (String)prisonerFxMap.get("critype");
                String fzlx = (String)prisonerFxMap.get("fzlx");
                String pritime = (String)prisonerFxMap.get("pritime");
                String arrJg = (String)prisonerFxMap.get("arrJg");
                String precri = (String)prisonerFxMap.get("precri");
                String canji = (String)prisonerFxMap.get("canji");
                String priBegin;
                if(prisonerFxMap.get("priBegin") instanceof Long) {
                    long priBeginL = (long)prisonerFxMap.get("priBegin");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    priBegin = sdf.format(new Date(priBeginL));
                } else {
                    priBegin = (String)prisonerFxMap.get("priBegin");
                }
                String priStop;
                if(prisonerFxMap.get("priStop") instanceof Long) {
                    long priStopL = (long)prisonerFxMap.get("priStop");
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    priStop = sdf.format(new Date(priStopL));
                } else {
                    priStop = (String)prisonerFxMap.get("priStop");
                }
                String addpenalty = (String)prisonerFxMap.get("addpenalty");
                String aftype = (String)prisonerFxMap.get("aftype");
                String bqzy = (String)prisonerFxMap.get("bqzy");
                String jinengtype = (String)prisonerFxMap.get("jinengtype");
                // 校验罪名
                if(StringUtils.isEmpty(critype)) {
                    //服刑信息 罪名不能为空。
                    errCodes.add("300001");
                }
                if(!StringUtils.isEmpty(critype)) {
                    String[] critypes = critype.split(",");
                    for(String a : critypes) {
                        if(!StrUtil.containsEquals(a,DICTIONARY.getaddpenalty())) {
                            if(stringRedisTemplate.hasKey("critypeCode")) {
                                String critypeCode = (String)stringRedisTemplate.opsForHash().get("critypeCode",a);
                                if(StringUtils.isEmpty(critypeCode)) {
                                    //服刑信息 罪名不正确。
                                    errCodes.add("300002");
                                    prisonerFxMap.put("critype","");
                                }
                            } else {
                                // 从数据库中查询是否存在该罪名code
                                Map<String,String> map = new HashMap<>(16);
                                map.put("codeType","2_12");
                                map.put("codeId",a);
                                SystemCode codeByMap = systemCodeMapper.getCodeByMap(map);
                                if(null == codeByMap) {
                                    //服刑信息 罪名不正确。
                                    errCodes.add("300002");
                                    prisonerFxMap.put("critype","");
                                }
                            }
                        }
                    }
                }
                // 校验犯罪类型
                if(StringUtils.isEmpty(fzlx)) {
                    //服刑信息 犯罪类型不能为空。
                    errCodes.add("300003");
                }
                if(!StringUtils.isEmpty(fzlx) && !StrUtil.contains(fzlx,DICTIONARY.getfzlx())) {
                    //服刑信息 犯罪类型不正确。
                    errCodes.add("300004");
                    prisonerFxMap.put("fzlx","");
                }
                // 校验现刑期
                if(StringUtils.isEmpty(pritime)) {
                    //服刑信息 现刑期不能为空。
                    errCodes.add("300005");
                }
                if(!StringUtils.isEmpty(pritime) && !StrUtil.containsEquals(pritime,DICTIONARY.getpritime())) {
                    //服刑信息 现刑期不正确。
                    errCodes.add("300006");
                    prisonerFxMap.put("pritime","");
                }
                // 校验逮捕机关
                if(StringUtils.isEmpty(arrJg)) {
                    //服刑信息 逮捕机关不能为空。
                    errCodes.add("300007");
                }
                if(!StringUtils.isEmpty(arrJg) && 50 < arrJg.length()) {
                    //服刑信息 逮捕机关长度不能超过50。
                    errCodes.add("300008");
                    prisonerFxMap.put("arrJg","");
                }
                // 校验是否累惯犯
                if(StringUtils.isEmpty(precri)) {
                    //服刑信息 是否累惯犯不能为空。
                    errCodes.add("300009");
                }
                if(!StringUtils.isEmpty(precri) && !StrUtil.contains(precri,DICTIONARY.getprecri())) {
                    //服刑信息 是否累惯犯不正确。
                    errCodes.add("300010");
                    prisonerFxMap.put("precri","");
                }
                // 校验是否疾病、残疾
                if(StringUtils.isEmpty(canji)) {
                    //服刑信息 是否疾病、残疾不能为空。
                    errCodes.add("300011");
                }
                if(!StringUtils.isEmpty(canji) && !StrUtil.containsEquals(canji,DICTIONARY.getcanji())) {
                    //服刑信息 是否疾病、残疾不正确。
                    errCodes.add("300012");
                    prisonerFxMap.put("canji","");
                }
                // 校验刑期起日
                if(StringUtils.isEmpty(priBegin)) {
                    //服刑信息 刑期起日不能为空。
                    errCodes.add("300013");
                }
                if(!StringUtils.isEmpty(priBegin) && DateUtil.checkStrDate(priBegin)) {
                    //服刑信息 刑期起日不正确。
                    errCodes.add("300014");
                    prisonerFxMap.put("priBegin","");
                }
                // 校验刑期止日
                if(StringUtils.equals(pritime,"9999") && StringUtils.isEmpty(priStop)) {
                    //服刑信息 刑期止日不能为空。
                    errCodes.add("300015");
                }
                if(!StringUtils.isEmpty(priStop) && DateUtil.checkStrDate(priStop)) {
                    //服刑信息 刑期止日不正确。
                    errCodes.add("300016");
                    prisonerFxMap.put("priStop","");
                }
                boolean flag = !StringUtils.isEmpty(priBegin) && !StringUtils.isEmpty(priStop) && 0 < priBegin.compareTo(priStop);
                if(StrUtil.containsEquals(Constants.PritimeTypeNow.PRITIME_YOUQI,Constants.PritimeTypeNow.PRITIME_JUYI,Constants.PritimeTypeNow.PRITIME_GUANZHI)
                        && flag) {
                    //服刑信息 刑期起日不能大于刑期止日。
                    errCodes.add("300017");
                    prisonerFxMap.put("priBegin","");
                    prisonerFxMap.put("priStop","");
                }
                // 校验附加刑
                if(StringUtils.isEmpty(addpenalty)) {
                    //服刑信息 附加刑不能为空。
                    errCodes.add("300018");
                }
                if(!StringUtils.isEmpty(addpenalty)) {
                    String[] addpenaltys = addpenalty.split(",");
                    for(String a : addpenaltys) {
                        if(!StrUtil.containsEquals(a,DICTIONARY.getaddpenalty())) {
                            //服刑信息 附加刑不正确。
                            errCodes.add("300019");
                            prisonerFxMap.put("addpenalty","");
                            break;
                        }
                    }
                }
                // 校验案犯类别
                if(StringUtils.isEmpty(aftype)) {
                    //服刑信息 案犯类别不能为空。
                    errCodes.add("300020");
                }
                if(!StringUtils.isEmpty(aftype) && !StrUtil.containsEquals(aftype,DICTIONARY.getaftype())) {
                    //服刑信息 案犯类别不正确。
                    errCodes.add("300021");
                    prisonerFxMap.put("aftype","");
                }
                if(StringUtils.isEmpty(bqzy)) {
                    //服刑信息 捕前职业不能为空。
                    errCodes.add("300022");
                }
                // 校验捕前职业
                if(!StringUtils.isEmpty(bqzy)) {
                    if(stringRedisTemplate.hasKey("bqzy")) {
                        String bqzyCode = (String)stringRedisTemplate.opsForHash().get("bqzy",bqzy);
                        if(StringUtils.isEmpty(bqzyCode)) {
                            //服刑信息 捕前职业不正确。
                            errCodes.add("300023");
                            prisonerFxMap.put("bqzy","");
                        }
                    } else {
                        // 从数据库中查询是否存在该补前职业code
                        Map<String,String> map = new HashMap<>(16);
                        map.put("codeType",Constants.CodeType.CODE_ZY_DM);
                        map.put("codeId",bqzy);
                        SystemCode codeByMap = systemCodeMapper.getCodeByMap(map);
                        if(null == codeByMap) {
                            //服刑信息 捕前职业不正确。
                            errCodes.add("300023");
                            prisonerFxMap.put("bqzy","");
                        }
                    }
                }
                // 校验捕前职业分类
                if(!StringUtils.isEmpty(jinengtype) && !StrUtil.contains(jinengtype,DICTIONARY.getjinengtype())) {
                    //服刑信息 捕前职业分类不正确。
                    errCodes.add("300024");
                    prisonerFxMap.put("jinengtype","");
                }
                // 封装实体类
                String json = JSON.toJSONString(prisonerFxMap);
                prisonerFxExcelTemp = JsonUtil.toBean(json,PrisonerFxExcelTemp.class);
                if(!StringUtils.isEmpty(pritime) && StrUtil.containsEquals(pritime,DICTIONARY.getDeathpenalty())) {
                    prisonerFxExcelTemp.setPriStop(null);
                }
            }
        }
        // 3、check社会关系表
        {
            for(PrisonerSrExcelTemp p : prisonerSrExcelTemps) {
                // 取出prisonerSrMap并校验
                String thename = p.getThename();
                String relation = p.getRelation();
                String srIdType = p.getSrIdtype();
                String idnumber = p.getIdnumber();
                String gender = p.getGender();
                Date age = p.getAge();
                String danwei = p.getDanwei();
                String tel = p.getTel();
                String mobile = p.getMobile();
                String addrpro = p.getAddrpro();
                String addrcity = p.getAddrcity();
                String addrcou = p.getAddrcou();
                String addrvil = p.getAddrvil();
                String addrdetail = p.getAddrdetail();
                p.setCreateUser(userDTO.getAccount());
                // 校验姓名
                if(StringUtils.isEmpty(thename)) {
                    //"配偶、父母、社会关系 姓名不能为空。
                    errCodes.add("400001");
                }
                if(!StringUtils.isEmpty(thename) && 30 < thename.length()) {
                    //配偶、父母、社会关系 姓名长度不能超过30。
                    errCodes.add("400002");
                    p.setThename("");
                }
                if(!StringUtils.isEmpty(relation) && !StrUtil.contains(relation,DICTIONARY.getrelation())) {
                    //配偶、父母、社会关系 关系编码不正确。
                    errCodes.add("400004");
                    p.setRelation("");
                }
                //校验证件类型
                if(StringUtils.isEmpty(srIdType)) {
                    //社会关系 证件类型不能为空。
                    errCodes.add("400050");
                }
                // 校验身份证
                if(!StringUtils.isEmpty(idnumber) && IdNumUtil.checkIdNum(idnumber)) {
                    //配偶、父母、社会关系 身份证号码不正确。
                    errCodes.add("400005");
                    p.setIdnumber("");
                }
                if(StringUtils.isEmpty(gender)) {
                    //社会关系 性别不能为空。
                    errCodes.add("400051");
                }
                if(!StringUtils.isEmpty(danwei) && 50 < danwei.length()) {
                    //配偶、父母、社会关系 工作单位长度不能超过50。
                    errCodes.add("400007");
                    p.setDanwei("");
                }
                // 校验出生日期
                if(null != age) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    String str = sdf.format(age);
                    if(DateUtil.checkStrDate(str)) {
                        //配偶、父母、社会关系 出生日期不正确。
                        errCodes.add("400008");
                        p.setAge(null);
                    }
                }
                // 固定电话
                if(!StringUtils.isEmpty(tel)) {
                    if(!PhoneUtil.phone(tel)) {
                        //配偶、父母、社会关系 固定电话不正确。
                        errCodes.add("400010");
                        p.setTel("");
                    }
                }
                // 手机号校验
                if(!StringUtils.isEmpty(mobile)) {
                    if(!PhoneUtil.isMobile(mobile)) {
                        //配偶、父母、社会关系 手机号码不正确。
                        errCodes.add("400011");
                        p.setMobile("");
                    }
                }
                if(!StringUtils.isEmpty(addrpro)) {
                    String pCodePro = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",addrpro);
                    if(!Constants.NumberStr.NUM_STR_FU_ONE.equals(pCodePro)) {
                        //配偶、父母、社会关系 家庭住址编码不正确。
                        errCodes.add("400016");
                        p.setAddrpro("");
                    } else {
                        if(!StringUtils.isEmpty(addrcity)) {
                            String pCodeCity = (String)stringRedisTemplate.opsForHash()
                                                                          .get("areaCodeAndPcode",addrcity);
                            if(!addrpro.equals(pCodeCity)) {
                                //配偶、父母、社会关系 家庭住址编码不正确。
                                errCodes.add("400016");
                                p.setAddrcity("");
                            } else {
                                if(!StringUtils.isEmpty(addrcou)) {
                                    String pCodeCou = (String)stringRedisTemplate.opsForHash()
                                                                                 .get("areaCodeAndPcode",addrcou);
                                    if(!addrcity.equals(pCodeCou)) {
                                        //配偶、父母、社会关系 家庭住址编码不正确。
                                        errCodes.add("400016");
                                        p.setAddrcou("");
                                    } else {
                                        if(!StringUtils.isEmpty(addrvil)) {
                                            String pCodeVill = (String)stringRedisTemplate.opsForHash()
                                                                                          .get("areaCodeAndPcode",addrvil);
                                            if(!addrcou.equals(pCodeVill)) {
                                                //配偶、父母、社会关系 家庭住址编码不正确。
                                                errCodes.add("400016");
                                                p.setAddrvil("");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if(!StringUtils.isEmpty(addrdetail) && 50 < addrdetail.length()) {
                    //配偶、父母、社会关系 家庭住址详细信息长度不能超过50。
                    errCodes.add("400018");
                    p.setAddrdetail("");
                }
                // 封装实体类
                if(!StringUtils.isEmpty(idnumber) && 18 == idnumber.length() && null == age) {
                    // 身份证不为空，并且为18位身份证，设置生日为身份证的7～14位
                    String year = idnumber.substring(6,10);
                    String month = idnumber.substring(10,12);
                    String day = idnumber.substring(12,14);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date birthday = null;
                    try {
                        // 注意格式需要与上面一致，不然会出现异常
                        birthday = sdf.parse(new StringBuffer(year).append("-").append(month).append("-").append(day)
                                                                   .toString());
                    } catch(ParseException e) {
                        log.error("发生异常:",e);
                    }
                    p.setAge(birthday);
                }
                // 拼接手机号
                StringBuilder sb = new StringBuilder(16);
                if(!StringUtils.isEmpty(p.getTel())) {
                    sb.append(p.getTel());
                }
                sb.append("|");
                if(!StringUtils.isEmpty(p.getMobile())) {
                    sb.append(p.getMobile());
                }
                p.setTel(sb.toString());
            }
        }
        // 4、check子女表
        {
            for(PrisonerZnExcelTemp prisonerZn1 : prisonerZnExcelTemps) {
                // 取出prisonerZnMap并校验
                String name = prisonerZn1.getName();
                String sex = prisonerZn1.getSex();
                String znIdType = prisonerZn1.getZnIdtype();
                String znsfId = prisonerZn1.getZnsfId();
                Date age = prisonerZn1.getAge();
                String jianhuren = prisonerZn1.getJianhuren();
                String kunnan = prisonerZn1.getKunnan();
                String shixue = prisonerZn1.getShixue();
                String liulang = prisonerZn1.getLiulang();
                String fanzui = prisonerZn1.getFanzui();
                String nativepro = prisonerZn1.getNativepro();
                String nativecity = prisonerZn1.getNativecity();
                String nativecou = prisonerZn1.getNativecou();
                String nativevill = prisonerZn1.getNativevill();
                String nativenum = prisonerZn1.getNativenum();
                String placepro = prisonerZn1.getPlacepro();
                String placecity = prisonerZn1.getPlacecity();
                String placecou = prisonerZn1.getPlacecou();
                String placevill = prisonerZn1.getPlacevill();
                String placenum = prisonerZn1.getPlacenum();
                prisonerZn1.setCreateUser(userDTO.getAccount());
                // 校验姓名
                if(StringUtils.isEmpty(name)) {
                    //子女 姓名不能为空。
                    errCodes.add("500001");
                }
                if(!StringUtils.isEmpty(name) && 30 < name.length()) {
                    //子女 姓名长度不能超过30。
                    errCodes.add("500002");
                    prisonerZn1.setName("");
                }
                if(!StringUtils.isEmpty(sex) && !StrUtil.containsEquals(sex,DICTIONARY.getsex())) {
                    //子女 性别不正确。
                    errCodes.add("500004");
                    prisonerZn1.setSex("");
                }
                if(StringUtils.isEmpty(znIdType)) {
                    //未成年子女 证件类型不能为空。
                    errCodes.add("500060");
                }
                // 校验身份证、年龄
                if(!StringUtils.isEmpty(znsfId) && IdNumUtil.checkIdNum(znsfId)) {
                    //子女 身份证号码不正确。
                    errCodes.add("500006");
                    prisonerZn1.setZnsfId("");
                }
                // 校验监护人情况
                if(!StringUtils.isEmpty(jianhuren) && !StrUtil.containsEquals(jianhuren,DICTIONARY.getjianhuren())) {
                    //子女 监护人情况不正确。
                    errCodes.add("500008");
                    prisonerZn1.setJianhuren("");
                }
                // 校验生活困难程度
                if(!StringUtils.isEmpty(kunnan) && !StrUtil.containsEquals(kunnan,DICTIONARY.getkunnan())) {
                    //子女 生活困难程度不正确。
                    errCodes.add("500010");
                    prisonerZn1.setKunnan("");
                }
                // 校验是否失学
                if(!StringUtils.isEmpty(shixue) && !StrUtil.containsEquals(shixue,DICTIONARY.getshixue())) {
                    //子女 是否失学不正确。
                    errCodes.add("500012");
                    prisonerZn1.setShixue("");
                }
                // 校验是否流浪社会
                if(!StringUtils.isEmpty(liulang) && !StrUtil.containsEquals(liulang,DICTIONARY.getliulang())) {
                    //子女 是否流浪社会不正确。
                    errCodes.add("500014");
                    prisonerZn1.setLiulang("");
                }
                // 校验有无违法犯罪行为
                if(!StringUtils.isEmpty(fanzui) && !StrUtil.containsEquals(fanzui,DICTIONARY.getfanzui())) {
                    //子女 有无违法犯罪行为不正确。
                    errCodes.add("500016");
                    prisonerZn1.setFanzui("");
                }
                // 校验户籍地址
                if(!StringUtils.isEmpty(nativepro)) {
                    String pCodePro = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",nativepro);
                    if(!Constants.NumberStr.NUM_STR_FU_ONE.equals(pCodePro)) {
                        //子女 户籍地址编码不正确。
                        errCodes.add("500021");
                        prisonerZn1.setNativepro("");
                    } else {
                        if(!StringUtils.isEmpty(nativecity)) {
                            String pCodeCity = (String)stringRedisTemplate.opsForHash()
                                                                          .get("areaCodeAndPcode",nativecity);
                            if(!nativepro.equals(pCodeCity)) {
                                //子女 户籍地址编码不正确。
                                errCodes.add("500021");
                                prisonerZn1.setNativecity("");
                            } else {
                                if(!StringUtils.isEmpty(nativecou)) {
                                    String pCodeCou = (String)stringRedisTemplate.opsForHash()
                                                                                 .get("areaCodeAndPcode",nativecou);
                                    if(!nativecity.equals(pCodeCou)) {
                                        //子女 户籍地址编码不正确。
                                        errCodes.add("500021");
                                        prisonerZn1.setNativecou("");
                                    } else {
                                        if(!StringUtils.isEmpty(nativevill)) {
                                            String pCodeVill = (String)stringRedisTemplate.opsForHash()
                                                                                          .get("areaCodeAndPcode",nativevill);
                                            if(!nativecou.equals(pCodeVill)) {
                                                //子女 户籍地址编码不正确。
                                                errCodes.add("500021");
                                                prisonerZn1.setNativevill("");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if(!StringUtils.isEmpty(nativenum) && 50 < nativenum.length()) {
                    //子女 户籍详细信息长度不能超过50。
                    errCodes.add("500023");
                    prisonerZn1.setNativenum("");
                }
                // 校验居住地址
                if(!StringUtils.isEmpty(placepro)) {
                    String pCodePro = (String)stringRedisTemplate.opsForHash().get("areaCodeAndPcode",placepro);
                    if(!Constants.NumberStr.NUM_STR_FU_ONE.equals(pCodePro)) {
                        //子女 居住地址编码不正确。
                        errCodes.add("500028");
                        prisonerZn1.setPlacepro("");
                    } else {
                        if(!StringUtils.isEmpty(placecity)) {
                            String pCodeCity = (String)stringRedisTemplate.opsForHash()
                                                                          .get("areaCodeAndPcode",placecity);
                            if(!placepro.equals(pCodeCity)) {
                                //子女 居住地址编码不正确。
                                errCodes.add("500028");
                                prisonerZn1.setPlacecity("");
                            } else {
                                if(!StringUtils.isEmpty(placecou)) {
                                    String pCodeCou = (String)stringRedisTemplate.opsForHash()
                                                                                 .get("areaCodeAndPcode",placecou);
                                    if(!placecity.equals(pCodeCou)) {
                                        //子女 居住地址编码不正确。
                                        errCodes.add("500028");
                                        prisonerZn1.setPlacecou("");
                                    } else {
                                        if(!StringUtils.isEmpty(placevill)) {
                                            String pCodeVill = (String)stringRedisTemplate.opsForHash()
                                                                                          .get("areaCodeAndPcode",placevill);
                                            if(!placecou.equals(pCodeVill)) {
                                                //子女 居住地址编码不正确。
                                                errCodes.add("500028");
                                                prisonerZn1.setPlacevill("");
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                if(!StringUtils.isEmpty(placenum) && 50 < placenum.length()) {
                    //子女 居住地址详细信息长度不能超过50。
                    errCodes.add("500030");
                    prisonerZn1.setPlacenum("");
                }
                // 封装实体类
                if(!StringUtils.isEmpty(znsfId) && 18 == znsfId.length() && null == age) {
                    // 身份证不为空，并且为18位身份证，设置生日为身份证的7～14位
                    String year = znsfId.substring(6,10);
                    String month = znsfId.substring(10,12);
                    String day = znsfId.substring(12,14);
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    Date birthday = null;
                    try {
                        // 注意格式需要与上面一致，不然会出现异常
                        birthday = sdf.parse(new StringBuffer(year).append("-").append(month).append("-").append(day)
                                                                   .toString());
                    } catch(ParseException e) {
                        log.error("发生异常:",e);
                    }
                    prisonerZn1.setAge(birthday);
                }
            }
        }
        // 5、封装返回结果
        if(!errCodes.isEmpty()) {
            result.put("err",true);
            result.put("result",errCodes);
            result.put("PrisonerMainExcelTemp",prisonerMainExcelTemp);
            log.error("------"+prisonerMainExcelTemp.getNativepro());
            result.put("PrisonerFxExcelTemp",prisonerFxExcelTemp);
            result.put("PrisonerSrExcelTemp",prisonerSrExcelTemps);
            result.put("PrisonerZnExcelTemp",prisonerZnExcelTemps);
            result.put("user",userDTO);
        } else {
            result.put("err",false);
            result.put("PrisonerMainExcelTemp",prisonerMainExcelTemp);
            result.put("PrisonerFxExcelTemp",prisonerFxExcelTemp);
            result.put("PrisonerSrExcelTemp",prisonerSrExcelTemps);
            result.put("PrisonerZnExcelTemp",prisonerZnExcelTemps);
            result.put("user",userDTO);
        }
        log.info("预安置人员信息录入【校验耗时】:{} ms",System.currentTimeMillis() - start);
        return result;
    }

    /**
     * 3、组装数据
     * @param user user
     * @param prisonerMainExcelTemp prisonerMainExcelTemp
     * @param prisonerFxExcelTemp prisonerFxExcelTemp
     * @param prisonerSrExcelTemps prisonerSrExcelTemps
     * @param prisonerZnExcelTemps prisonerZnExcelTemps
     */
    private void assembled(UserInterFaceEntity user,PrisonerMainExcelTemp prisonerMainExcelTemp,PrisonerFxExcelTemp prisonerFxExcelTemp,List<PrisonerSrExcelTemp> prisonerSrExcelTemps,List<PrisonerZnExcelTemp> prisonerZnExcelTemps) {
        // 0、定义开始时间
        long start = System.currentTimeMillis();
        // 1、定义返回串
        // 2、取出忽略字段（忽略字段在数据库表tbsys_interface_user表的unCheckField字段配置）
        // 3、封装
        // 3.1、封装主表
        int count1 = prisonerMainMapper.getRepeatJbxx(prisonerMainExcelTemp.getPriNum());
        if(0 != count1) {
            throw new RuntimeException("安置帮教系统中存在该犯罪编号的基本信息");
        }
        Date date = new Date();
        prisonerMainExcelTemp.setId(IdGen.strid());
        if(null == prisonerMainExcelTemp.getUsedName() || "".equals(prisonerMainExcelTemp.getUsedName())) {
            prisonerMainExcelTemp.setUsedName("无");
        }
        prisonerMainExcelTemp.setCreateUser(user.getAccount());
        prisonerMainExcelTemp.setCreateTime(date);
        prisonerMainExcelTemp.setUpdateUser(user.getAccount());
        prisonerMainExcelTemp.setUpdateTime(date);
        prisonerMainExcelTemp.setPdanwei(user.getDepartid());
        prisonerMainExcelTemp.setPdanweiName(user.getDepartName());
        prisonerMainExcelTemp.setDelFlag(Constants.NumberStr.NUM_STR_ZERO);
        String idNum = prisonerMainExcelTemp.getIdNum();
        if(StringUtils.isNotBlank(idNum)) {
            prisonerMainExcelTemp.setIdNum(Sm4.encryptEcb(idNum));
        } else {
            prisonerMainExcelTemp.setIdNum(Sm4.encryptEcb(Constants.StrFinalValue.WU));
        }
        if(Constants.OrgLevel.LEVEL_KSS.equals(user.getLevel())) {
            //看守所录入
            prisonerMainExcelTemp.setPstate(Constants.InputEspecially.INPUT_KSS_INTERFACE);
        }
        if(Constants.OrgLevel.LEVEL_JY.equals(user.getLevel())) {
            //监狱录入
            prisonerMainExcelTemp.setPstate(Constants.InputEspecially.INPUT_JY_INTERFACE);
        }
        if(Constants.OrgLevel.LEVEL_SJZX.equals(user.getLevel())) {
            //社娇录入
            prisonerMainExcelTemp.setPstate(Constants.InputEspecially.INPUT_SJ_INTERFACE);
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getNativepro())) {
            String nativeProName = (String)stringRedisTemplate.opsForHash()
                                                              .get("areaCode",prisonerMainExcelTemp.getNativepro());
            nativeProName = StringUtils.isEmpty(nativeProName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getNativepro()) : nativeProName;
            prisonerMainExcelTemp.setNativeproName(nativeProName);
        } else {
            prisonerMainExcelTemp.setNativeproName("");
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getNativecity())) {
            String nativeCityName = (String)stringRedisTemplate.opsForHash()
                                                               .get("areaCode",prisonerMainExcelTemp.getNativecity());
            nativeCityName = StringUtils.isEmpty(nativeCityName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getNativecity()) : nativeCityName;
            prisonerMainExcelTemp.setNativecityName(nativeCityName);
        } else {
            prisonerMainExcelTemp.setNativecityName("");
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getNativecou())) {
            String nativeCouName = (String)stringRedisTemplate.opsForHash()
                                                              .get("areaCode",prisonerMainExcelTemp.getNativecou());
            nativeCouName = StringUtils.isEmpty(nativeCouName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getNativecou()) : nativeCouName;
            prisonerMainExcelTemp.setNativecouName(nativeCouName);
        } else {
            prisonerMainExcelTemp.setNativecouName("");
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getNativevill())) {
            String nativeVillName = (String)stringRedisTemplate.opsForHash()
                                                               .get("areaCode",prisonerMainExcelTemp.getNativevill());
            nativeVillName = StringUtils.isEmpty(nativeVillName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getNativevill()) : nativeVillName;
            prisonerMainExcelTemp.setNativevillName(nativeVillName);
        } else {
            prisonerMainExcelTemp.setNativevillName("");
        }
        // 若居住省市县街道编码不为空,则根据redis中行政区划数据获取对应的中文
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getPlacepro())) {
            String placeProName = (String)stringRedisTemplate.opsForHash()
                                                             .get("areaCode",prisonerMainExcelTemp.getPlacepro());
            placeProName = StringUtils.isEmpty(placeProName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getPlacepro()) : placeProName;
            prisonerMainExcelTemp.setPlaceproName(placeProName);
        } else {
            prisonerMainExcelTemp.setPlaceproName("");
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getPlacecity())) {
            String placeCityName = (String)stringRedisTemplate.opsForHash()
                                                              .get("areaCode",prisonerMainExcelTemp.getPlacecity());
            placeCityName = StringUtils.isEmpty(placeCityName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getPlacecity()) : placeCityName;
            prisonerMainExcelTemp.setPlacecityName(placeCityName);
        } else {
            prisonerMainExcelTemp.setPlacecityName("");
        }
        if(null != prisonerMainExcelTemp.getPlacecou()) {
            String placeCouName = (String)stringRedisTemplate.opsForHash()
                                                             .get("areaCode",prisonerMainExcelTemp.getPlacecou());
            placeCouName = StringUtils.isEmpty(placeCouName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getPlacecou()) : placeCouName;
            prisonerMainExcelTemp.setPlacecouName(placeCouName);
        } else {
            prisonerMainExcelTemp.setPlacecouName("");
        }
        if(!StringUtils.isEmpty(prisonerMainExcelTemp.getPlacevill())) {
            String placevillName = (String)stringRedisTemplate.opsForHash()
                                                              .get("areaCode",prisonerMainExcelTemp.getPlacevill());
            placevillName = StringUtils.isEmpty(placevillName) ? systemCodeMapper.getNameByCode(prisonerMainExcelTemp.getPlacevill()) : placevillName;
            prisonerMainExcelTemp.setPlacevillName(placevillName);
        } else {
            prisonerMainExcelTemp.setPlacevillName("");
        }
        prisonerMainExcelTemp.setState(Constants.NumberStr.NUM_STR_ZERO);
        // 3.2、封装服刑表
        int count3 = prisonerFxMapper.getRepeatFxxx(prisonerFxExcelTemp.getPriNum());
        if(0 != count3) {
            throw new RuntimeException("安置帮教系统中存在该犯罪编号的服刑信息");
        }
        prisonerFxExcelTemp.setId(IdGen.strid());
        prisonerFxExcelTemp.setCreateUser(user.getAccount());
        prisonerFxExcelTemp.setCreateTime(date);
        prisonerFxExcelTemp.setUpdateUser(user.getAccount());
        prisonerFxExcelTemp.setUpdateTime(date);
        // 3.3、封装社会关系表
        for(PrisonerSrExcelTemp prisonerSrExcelTemp : prisonerSrExcelTemps) {
            prisonerSrExcelTemp.setId(IdGen.strid());
            prisonerSrExcelTemp.setCreateUser(user.getAccount());
            prisonerSrExcelTemp.setCreateTime(date);
            prisonerSrExcelTemp.setUpdateUser(user.getAccount());
            prisonerSrExcelTemp.setUpdateTime(date);
            String idnumcber = prisonerSrExcelTemp.getIdnumber();
            if(StringUtils.isNotBlank(idnumcber)) {
                prisonerSrExcelTemp.setIdnumber(Sm4.encryptEcb(idnumcber));
            } else {
                prisonerSrExcelTemp.setIdnumber(Sm4.encryptEcb(Constants.StrFinalValue.WU));
            }
            if(StringUtils.isEmpty(prisonerSrExcelTemp.getSrIdtype())) {
                //如果证件类型为空，则设置证件类型为无
                prisonerSrExcelTemp.setSrIdtype("98");
            }
            if(!StringUtils.isEmpty(prisonerSrExcelTemp.getAddrpro())) {
                String addrproname = (String)stringRedisTemplate.opsForHash()
                                                                .get("areaCode",prisonerSrExcelTemp.getAddrpro());
                addrproname = StringUtils.isEmpty(addrproname) ? systemCodeMapper.getNameByCode(prisonerSrExcelTemp.getAddrpro()) : addrproname;
                prisonerSrExcelTemp.setAddrproname(addrproname);
            } else {
                prisonerSrExcelTemp.setAddrproname("");
            }
            if(!StringUtils.isEmpty(prisonerSrExcelTemp.getAddrcity())) {
                String addrcityname = (String)stringRedisTemplate.opsForHash()
                                                                 .get("areaCode",prisonerSrExcelTemp.getAddrcity());
                addrcityname = StringUtils.isEmpty(addrcityname) ? systemCodeMapper.getNameByCode(prisonerSrExcelTemp.getAddrcity()) : addrcityname;
                prisonerSrExcelTemp.setAddrcityname(addrcityname);
            } else {
                prisonerSrExcelTemp.setAddrcityname("");
            }
            if(!StringUtils.isEmpty(prisonerSrExcelTemp.getAddrcou())) {
                String addrcouname = (String)stringRedisTemplate.opsForHash()
                                                                .get("areaCode",prisonerSrExcelTemp.getAddrcou());
                addrcouname = StringUtils.isEmpty(addrcouname) ? systemCodeMapper.getNameByCode(prisonerSrExcelTemp.getAddrcou()) : addrcouname;
                prisonerSrExcelTemp.setAddrcouname(addrcouname);
            } else {
                prisonerSrExcelTemp.setAddrcouname("");
            }
            if(!StringUtils.isEmpty(prisonerSrExcelTemp.getAddrvil())) {
                String addrvilname = (String)stringRedisTemplate.opsForHash()
                                                                .get("areaCode",prisonerSrExcelTemp.getAddrvil());
                addrvilname = StringUtils.isEmpty(addrvilname) ? systemCodeMapper.getNameByCode(prisonerSrExcelTemp.getAddrvil()) : addrvilname;
                prisonerSrExcelTemp.setAddrvilname(addrvilname);
            } else {
                prisonerSrExcelTemp.setAddrvilname("");
            }
        }
        // 3.4、封装子女表
        for(PrisonerZnExcelTemp prisonerZn : prisonerZnExcelTemps) {
            prisonerZn.setId(IdGen.strid());
            prisonerZn.setCreateUser(user.getAccount());
            prisonerZn.setCreateTime(date);
            prisonerZn.setUpdateUser(user.getAccount());
            prisonerZn.setUpdateTime(date);
            String znsfId = prisonerZn.getZnsfId();
            if(StringUtils.isNotBlank(znsfId)) {
                prisonerZn.setZnsfId(Sm4.encryptEcb(znsfId));
            } else {
                prisonerZn.setZnsfId(Sm4.encryptEcb(Constants.StrFinalValue.WU));
            }
            if(!StringUtils.isEmpty(prisonerZn.getNativepro())) {
                String nativeproName = (String)stringRedisTemplate.opsForHash()
                                                                  .get("areaCode",prisonerZn.getNativepro());
                nativeproName = StringUtils.isEmpty(nativeproName) ? systemCodeMapper.getNameByCode(prisonerZn.getNativepro()) : nativeproName;
                prisonerZn.setNativeproName(nativeproName);
            } else {
                prisonerZn.setNativeproName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getNativecity())) {
                String nativecityName = (String)stringRedisTemplate.opsForHash()
                                                                   .get("areaCode",prisonerZn.getNativecity());
                nativecityName = StringUtils.isEmpty(nativecityName) ? systemCodeMapper.getNameByCode(prisonerZn.getNativecity()) : nativecityName;
                prisonerZn.setNativecityName(nativecityName);
            } else {
                prisonerZn.setNativecityName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getNativecou())) {
                String nativecouName = (String)stringRedisTemplate.opsForHash()
                                                                  .get("areaCode",prisonerZn.getNativecou());
                nativecouName = StringUtils.isEmpty(nativecouName) ? systemCodeMapper.getNameByCode(prisonerZn.getNativecou()) : nativecouName;
                prisonerZn.setNativecouName(nativecouName);
            } else {
                prisonerZn.setNativecouName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getNativevill())) {
                String nativevillName = (String)stringRedisTemplate.opsForHash()
                                                                   .get("areaCode",prisonerZn.getNativevill());
                nativevillName = StringUtils.isEmpty(nativevillName) ? systemCodeMapper.getNameByCode(prisonerZn.getNativevill()) : nativevillName;
                prisonerZn.setNativevillName(nativevillName);
            } else {
                prisonerZn.setNativevillName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getPlacepro())) {
                String placeproName = (String)stringRedisTemplate.opsForHash().get("areaCode",prisonerZn.getPlacepro());
                placeproName = StringUtils.isEmpty(placeproName) ? systemCodeMapper.getNameByCode(prisonerZn.getPlacepro()) : placeproName;
                prisonerZn.setPlaceproName(placeproName);
            } else {
                prisonerZn.setPlaceproName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getPlacecity())) {
                String placecityName = (String)stringRedisTemplate.opsForHash()
                                                                  .get("areaCode",prisonerZn.getPlacecity());
                placecityName = StringUtils.isEmpty(placecityName) ? systemCodeMapper.getNameByCode(prisonerZn.getPlacecity()) : placecityName;
                prisonerZn.setPlacecityName(placecityName);
            } else {
                prisonerZn.setPlacecityName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getPlacecou())) {
                String placecouName = (String)stringRedisTemplate.opsForHash().get("areaCode",prisonerZn.getPlacecou());
                placecouName = StringUtils.isEmpty(placecouName) ? systemCodeMapper.getNameByCode(prisonerZn.getPlacecou()) : placecouName;
                prisonerZn.setPlacecouName(placecouName);
            } else {
                prisonerZn.setPlacecouName("");
            }
            if(!StringUtils.isEmpty(prisonerZn.getPlacevill())) {
                String placevillName = (String)stringRedisTemplate.opsForHash()
                                                                  .get("areaCode",prisonerZn.getPlacevill());
                placevillName = StringUtils.isEmpty(placevillName) ? systemCodeMapper.getNameByCode(prisonerZn.getPlacevill()) : placevillName;
                prisonerZn.setPlacevillName(placevillName);
            } else {
                prisonerZn.setPlacevillName("");
            }
        }
        log.info("预安置人员信息录入【封装总耗时】:{} ms",System.currentTimeMillis() - start);
    }

    /**
     * 5、保存预安置人员(入库方法)
     * @param prisonerMainExcelTemp prisonerMainExcelTemp
     * @param prisonerFxExcelTemp prisonerFxExcelTemp
     * @param prisonerSrExcelTemps prisonerSrExcelTemps
     * @param prisonerZnExcelTemps prisonerZnExcelTemps
     * @param priNum priNum
     * @param user user
     * @return Result
     */
    @Transactional(rollbackFor = Exception.class)
    public Result saveT(PrisonerMainExcelTemp prisonerMainExcelTemp,PrisonerFxExcelTemp prisonerFxExcelTemp,List<PrisonerSrExcelTemp> prisonerSrExcelTemps,List<PrisonerZnExcelTemp> prisonerZnExcelTemps,String priNum,UserInterFaceEntity user) {
        // 1、定义入库开始时间
        long start = System.currentTimeMillis();
        try {
            // 2、为主表、多媒体表、服刑表、社会关系表、子女表、状态表 设置犯罪编号
            prisonerMainExcelTemp.setPriNum(priNum);
            prisonerFxExcelTemp.setPriNum(priNum);
            for(PrisonerSrExcelTemp prisonerSrExcelTemp : prisonerSrExcelTemps) {
                prisonerSrExcelTemp.setPriNum(priNum);
            }
            for(PrisonerZnExcelTemp prisonerZnExcelTemp : prisonerZnExcelTemps) {
                prisonerZnExcelTemp.setPriNum(priNum);
            }
            // 3、入库主表
            // 下面这句需要做特殊判断
            prisonerMainExcelTemp.setState(Constants.NumberStr.NUM_STR_ONE);
            if(!prisonerMainExcelTempBatchService.save(prisonerMainExcelTemp)) {
                log.error("主表信息保存失败！");
                throw new RuntimeException("主表信息保存失败");
            }
            // 6、入库服刑表
            if(!prisonerFxExcelTempBatchService.save(prisonerFxExcelTemp)) {
                log.error("服刑信息保存失败！");
                throw new RuntimeException("服刑信息保存失败");
            }
            // 7、入库社会关系表
            if(!prisonerSrExcelTempBatchService.saveBatch(prisonerSrExcelTemps)) {
                log.error("社会关系信息保存失败！");
                throw new RuntimeException("社会关系信息保存失败");
            }
            // 8、入库子女表
            if(!prisonerZnExcelTempBatchService.saveBatch(prisonerZnExcelTemps)) {
                log.error("子女信息保存失败！");
                throw new RuntimeException("子女信息保存失败");
            }
        } catch(RuntimeException e) {
            log.error("发生异常：",e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return Result.failure(ReturnCode.FAILURE);
        }
        log.info("预安置人员信息录入【入库耗时】:{} ms",System.currentTimeMillis() - start);
        if(prisonerMainExcelTemp.getSuccessFlag().equals(Constants.NumberStr.NUM_STR_ONE)) {
            return Result.failure(ReturnCode.FAILURE);
        } else {
            return Result.success();
        }
    }
}